package com.xuecheng.media.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.xuecheng.base.model.PageParams;
import com.xuecheng.base.model.PageResult;
import com.xuecheng.base.model.RestResponse;
import com.xuecheng.media.model.dto.QueryMediaParamsDto;
import com.xuecheng.media.model.dto.UploadFileParamsDto;
import com.xuecheng.media.model.dto.UploadFileResultDto;
import com.xuecheng.media.model.po.MediaFiles;
import io.minio.GetObjectArgs;

import java.io.File;

/**
 * @author Mr.M
 * @version 1.0
 * @description 媒资文件管理业务类
 * @date 2022/9/10 8:55
 */
public interface MediaFileService extends IService<MediaFiles> {

    /**
     * @param pageParams          分页参数
     * @param queryMediaParamsDto 查询条件
     * @return com.xuecheng.base.model.PageResult<com.xuecheng.media.model.po.MediaFiles>
     * @description 媒资文件查询方法
     * @author Mr.M
     * @date 2022/9/10 8:57
     */
    PageResult<MediaFiles> queryMediaFiels(Long companyId, PageParams pageParams, QueryMediaParamsDto queryMediaParamsDto);

    /**
     * 上传文件
     *
     * @param companyId    机构Id
     * @param absolutePath 上传文件绝对路径
     * @return 存储的媒资信息
     */
    UploadFileResultDto uploadFile(Long companyId, UploadFileParamsDto uploadFileParamsDto, String absolutePath);

    /**
     * 保存媒资信息到数据库
     * @param companyId 机构Id
     * @param uploadFileParamsDto 上传文件参数
     * @param filename 文件名称
     * @param fileMd5 文件加密md5值
     * @param objName 存储对象名称
     * @param bucketName 存储桶名称
     * @return 添加的媒资信息
     */
    MediaFiles saveMediaFiles(Long companyId, UploadFileParamsDto uploadFileParamsDto, String filename, String fileMd5, String objName,String bucketName);

    /**
     * 检查文件是否存在
     * @param fileMd5 文件md5值
     * @return true存在文件，false不存在文件
     */
    RestResponse<Boolean> checkFiles(String fileMd5);

    /**
     * 检查分块文件是否存在
     *
     * @param fileMd5 文件md5值
     * @param chunk   分块文件编号
     * @return true存在文件，false不存在文件
     */
    RestResponse<Boolean> checkChunk(String fileMd5, Integer chunk);

    /**
     * 上传分块文件
     * @param localPath 本地文件路径
     * @param fileMd5 文件md5值
     * @param chunk 分块文件编号
     * @return 响应分块文件信息
     */
    RestResponse uploadChunk(String localPath, String fileMd5, Integer chunk);

    /**
     * 合并分块文件
     * @param companyId 机构Id
     * @param fileMd5 文件Md5
     * @param fileName 文件名称
     * @param chunkTotal 分块总数
     * @param uploadFileParamsDto 上传参数
     * @return 响应合并结果
     */
    RestResponse mergeChunks(Long companyId,String fileMd5, String fileName, Integer chunkTotal, UploadFileParamsDto uploadFileParamsDto);

    /**
     * 删除分块文件
     * @param chunkTotal 分块总数
     * @param chunkFilePath 分块路径
     */
    void deleteChunk(Integer chunkTotal, String chunkFilePath);

    /**
     * 从Minio下载到本地保存
     * @param fileMd5 媒资md5值
     * @param mergeName 媒资名称
     * @param getObjectArgs 下载对象参数
     * @return 下载文件信息
     */
    File downLoadFile(String fileMd5, String mergeName, GetObjectArgs getObjectArgs);

    /**
     * 上传文件到minio
     * @param localFilePath 上传文件本地路径
     * @param objectName 对象名称
     * @param mimeType 文件类型
     * @param bucket 存储桶
     * @return 是否上传成功
     */
    boolean uploadMinio(String localFilePath, String objectName, String mimeType, String bucket);

    /**
     * 删除Minio文件
     * @param filePath 文件路径
     * @param bucket 文件桶
     * @return 是否删除成功
     */
    boolean deleteUploadFile(String filePath,String bucket);
}
